# 概念
import functools
import math


def high_fun(f, arr):
    return [f(x) for x in arr]


# 平方函数
def square(n):
    return n ** 2


# 测试
def invoke_demo():
    print(high_fun(square, list(range(10))))


# map函数
def invoke_map():
    # 使用系统自带数学函数
    facMap = map(math.factorial, list(range(10)))
    print(list(facMap))

    # 使用自定义函数
    squareMap = map(square, list(range(10)))
    print(list(squareMap))


# reduce函数
def invoke_reduce():
    result = functools.reduce(lambda x, y: x + y, list(range(6)))
    print(result)
    print(list(range(5)))


# 判断偶数
def boy(n):
    if n % 2 == 0:
        return True
    return False


# filter函数
def invoke_filter():
    # 自定义函数
    filterList = filter(boy, list(range(20)))
    print(list(filterList))

    filterList2 = filter(lambda n: n % 2 == 0, list(range(20)))
    print(list(filterList2))


# sorted函数
def invoke_sorted():
    list01 = [5, -1, 3, 6, -7, 8, -11, 2]
    list02 = ['apple', 'pig', 'monkey', 'money']

    print(sorted(list01))
    # print out: [-11, -7, -1, 2, 3, 5, 6, 8]

    print(sorted(list01, key=abs))
    # print out: [-1, 2, 3, 5, 6, -7, 8, -11]

    # 默认升序
    print(sorted(list02))
    # print out: ['apple', 'money', 'monkey', 'pig']

    # 降序
    print(sorted(list02, reverse=True))
    # print out: ['pig', 'monkey', 'money', 'apple']

    # 匿名函数排序
    print(sorted(list02, key=lambda x: len(x), reverse=True))
